package com.common.util;

import java.sql.Date;
import java.text.DateFormat;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 
 * 时间日期工具�? 
 *
 */

public final class DateUtils
{
	
	private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/yyyy");
	private static final SimpleDateFormat DATE_TIME_FORMAT = new SimpleDateFormat("MM/dd/yyyy HH:mm");
	private static final SimpleDateFormat ORA_DATE_FORMAT = new SimpleDateFormat("yyyyMMdd");
	private static final SimpleDateFormat ORA_DATE_TIME_FORMAT = new SimpleDateFormat("yyyyMMddHHmm");
	private static final int dayArray[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31,30, 31};
	private static SimpleDateFormat sdf = new SimpleDateFormat();
	    
    private DateUtils()
    {
    }
    
    /**
     * 把日期字符串转换成日�?
     * @param dateString	日期字符�? 如："2004-02-12 12:30:10"
     * @param partten	日期表达�? 如："yyyy-MM-dd HH:mm:ss"
     * @return
     */
    public static java.util.Date StringToDate(String dateString, String partten)
    {
        SimpleDateFormat df = new SimpleDateFormat(partten);
        return df.parse(dateString, new ParsePosition(0));
    }
    
    /**
     * 将日期字符串转换成java.sql.Date
     * @param dateString	日期字符�? 如："2004-02-12 12:30:10"
     * @param partten	日期表达�? 如："yyyy-MM-dd HH:mm:ss" 
     * @return
     */
    public static Date toSQLDate(String dateString, String partten)
    {
        SimpleDateFormat df = new SimpleDateFormat(partten);
        return DateToSQLDate(df.parse(dateString, new ParsePosition(0)));
    }
    
    /**
     * 将java.util.Date转换成java.sql.Date 
     * @param date
     * @return
     */
    public static Date DateToSQLDate(java.util.Date date)
    {
        return new Date(date.getTime());
    }
    
    /**
     * 将Date类型日期转换成指定格式字符串
     * @param date	Date对象，如 new Date(107,7,30,11,11,11)
     * @param partten	日期表达�? 如："yyyy-MM-dd HH:mm:ss" 
     * @return
     */
    public static String toString(java.util.Date date, String partten)
    {
        if(date == null)
        {
            return "";
        } else
        {
            SimpleDateFormat df = new SimpleDateFormat(partten);
            return df.format(date);
        }
    }
    
    /**
     * 获得Calendar对象
     * @return
     */
    public static synchronized Calendar getCalendar()
    {
        return GregorianCalendar.getInstance();
    }
    
    /**
     * 获得精确到毫秒级的日期的字符串表示，格式为yyyy-MM-dd HH:mm:ss,SSS 
     * @return
     */
    public static synchronized String getDateMilliFormat()
    {
        Calendar cal = Calendar.getInstance();
        return getDateMilliFormat(cal);
    }
    
    /**
     * 获得精确到毫秒级的日期的字符串表示，格式为yyyy-MM-dd HH:mm:ss,SSS 
     * @param cal	Calendar对象
     * @return
     */
    public static synchronized String getDateMilliFormat(Calendar cal)
    {
        String pattern = "yyyy-MM-dd HH:mm:ss,SSS";
        return getDateFormat(cal, pattern);
    }
    
    /**
     * 获得精确到毫秒级的日期的字符串表示，格式为yyyy-MM-dd HH:mm:ss,SSS 
     * @param date	Date对象
     * @return
     */
    public static synchronized String getDateMilliFormat(java.util.Date date)
    {
        String pattern = "yyyy-MM-dd HH:mm:ss,SSS";
        return getDateFormat(date, pattern);
    }
    
    /**
     * 将格式为yyyy-MM-dd HH:mm:ss,SSS的日期字符串解析为Calendar类型 
     * @param strDate	日期字符�?,�?"2007-08-25 12:10:45,300"
     * @return
     */
    public static synchronized Calendar parseCalendarMilliFormat(String strDate)
    {
        String pattern = "yyyy-MM-dd HH:mm:ss,SSS";
        return parseCalendarFormat(strDate, pattern);
    }
    
    /**
     * 日期字符�?,�?"2007-08-25 12:10:45,300" 
     * @param strDate 日期字符�?,�?"2007-08-25 12:10:45,300" 
     * @return
     */
    public static synchronized java.util.Date parseDateMilliFormat(String strDate)
    {
        String pattern = "yyyy-MM-dd HH:mm:ss,SSS";
        return parseDateFormat(strDate, pattern);
    }
    
    /**
     * 获得精确到秒的日期的字符串表示，格式为yyyy-MM-dd HH:mm:ss 
     * @return
     */
    public static synchronized String getDateSecondFormat()
    {
        Calendar cal = Calendar.getInstance();
        return getDateSecondFormat(cal);
    }
    
    /**
     * 获得精确到秒的日期的字符串表示，格式为yyyy-MM-dd HH:mm:ss 
     * @param cal Calendar对象
     * @return
     */
    public static synchronized String getDateSecondFormat(Calendar cal)
    {
        String pattern = "yyyy-MM-dd HH:mm:ss";
        return getDateFormat(cal, pattern);
    }
    
    /**
     * 获得精确到秒的日期的字符串表示，格式为yyyy-MM-dd HH:mm:ss 
     * @param date	Date对象
     * @return
     */
    public static synchronized String getDateSecondFormat(java.util.Date date)
    {
        String pattern = "yyyy-MM-dd HH:mm:ss";
        return getDateFormat(date, pattern);
    }
    
    /**
     * 将格式为yyyy-MM-dd HH:mm:ss的日期字符串解析为Calendar类型
     * @param strDate	日期字符�? 如："2004-02-12 12:30:10"
     * @return
     */
    public static synchronized Calendar parseCalendarSecondFormat(String strDate)
    {
        String pattern = "yyyy-MM-dd HH:mm:ss";
        return parseCalendarFormat(strDate, pattern);
    }
    
    /**
     * 将格式为yyyy-MM-dd HH:mm:ss的日期字符串解析为Date类型
     * @param strDate 日期字符�? 如："2004-02-12 12:30:10"
     * @return
     */
    public static synchronized java.util.Date parseDateSecondFormat(String strDate)
    {
        String pattern = "yyyy-MM-dd HH:mm:ss";
        return parseDateFormat(strDate, pattern);
    }
    
    /**
     * 获得日期的字符串表示，格式为yyyy-MM-dd HH:mm 
     * @return String
     */
    public static synchronized String getDateMinuteFormat()
    {
        Calendar cal = Calendar.getInstance();
        return getDateMinuteFormat(cal);
    }
    
    /**
     * 获得日期的字符串表示，格式为yyyy-MM-dd HH:mm 
     * @param cal Calendar对象
     * @return
     */
    public static synchronized String getDateMinuteFormat(Calendar cal)
    {
        String pattern = "yyyy-MM-dd HH:mm";
        return getDateFormat(cal, pattern);
    }
    
    /**
     * 获得日期的字符串表示，格式为yyyy-MM-dd HH:mm 
     * @param date Date对象
     * @return
     */
    public static synchronized String getDateMinuteFormat(java.util.Date date)
    {
        String pattern = "yyyy-MM-dd HH:mm";
        return getDateFormat(date, pattern);
    }
    
    /**
     * 将格式为yyyy-MM-dd HH:mm的日期字符串解析为Calendar类型
     * @param strDate  日期字符�? 如："2004-02-12 12:30"
     * @return
     */
    public static synchronized Calendar parseCalendarMinuteFormat(String strDate)
    {
        String pattern = "yyyy-MM-dd HH:mm";
        return parseCalendarFormat(strDate, pattern);
    }
    
    /**
     *  日期字符�? 如："2004-02-12 12:30"
     * @param strDate  日期字符�? 如："2004-02-12 12:30"
     * @return
     */
    public static synchronized java.util.Date parseDateMinuteFormat(String strDate)
    {
        String pattern = "yyyy-MM-dd HH:mm";
        return parseDateFormat(strDate, pattern);
    }
    
    /**
     * 获得日期的字符串表示，格式为yyyy-MM-dd 
     * @return
     */
    public static synchronized String getDateDayFormat()
    {
        Calendar cal = Calendar.getInstance();
        return getDateDayFormat(cal);
    }
    
    /**
     * 获得日期的字符串表示，格式为yyyy-MM-dd 
     * @param cal	Calendar对象
     * @return
     */
    public static synchronized String getDateDayFormat(Calendar cal)
    {
        String pattern = "yyyy-MM-dd";
        return getDateFormat(cal, pattern);
    }
    
    /**
     * 获得日期的字符串表示，格式为yyyy-MM-dd 
     * @param date
     * @return
     */
    public static synchronized String getDateDayFormat(java.util.Date date)
    {
        String pattern = "yyyy-MM-dd";
        return getDateFormat(date, pattern);
    }
    
    /**
     * 将格式为yyyy-MM-dd的日期字符串解析为Calendar类型
     * @param strDate	日期字符�? 如："2004-02-12" 
     * @return
     */
    public static synchronized Calendar parseCalendarDayFormat(String strDate)
    {
        String pattern = "yyyy-MM-dd";
        return parseCalendarFormat(strDate, pattern);
    }
    
    /**
     * 将格式为yyyy-MM-dd的日期字符串解析为Date类型
     * @param strDate	日期字符�? 如："2004-02-12" 
     * @return
     */
    public static synchronized java.util.Date parseDateDayFormat(String strDate)
    {
        String pattern = "yyyy-MM-dd";
        return parseDateFormat(strDate, pattern);
    }
    
    /**
     * 转换为日期字符串，格式为yyyy-MM-dd_HH-mm-ss 
     * @return
     */
    public static synchronized String getDateFileFormat()
    {
        Calendar cal = Calendar.getInstance();
        return getDateFileFormat(cal);
    }
    
    /**
     * 将Calendar类型日期转换成日期字符串，格式为yyyy-MM-dd_HH-mm-ss 
     * @param cal
     * @return
     */
    public static synchronized String getDateFileFormat(Calendar cal)
    {
        String pattern = "yyyy-MM-dd_HH-mm-ss";
        return getDateFormat(cal, pattern);
    }
    
    /**
     * 将Date类型日期转换成日期字符串，格式为yyyy-MM-dd_HH-mm-ss 
     * @param date	Date对象，如 new Date(109,11,22,11,22,33) 
     * @return
     */
    public static synchronized String getDateFileFormat(java.util.Date date)
    {
        String pattern = "yyyy-MM-dd_HH-mm-ss";
        return getDateFormat(date, pattern);
    }
    
    /**
     * 将格式为yyyy-MM-dd_HH-mm-ss的日期字符串解析为Calendar类型
     * @param strDate	日期字符串，�? "2009-12-22_11-22-33" 
     * @return
     */
    public static synchronized Calendar parseCalendarFileFormat(String strDate)
    {
        String pattern = "yyyy-MM-dd_HH-mm-ss";
        return parseCalendarFormat(strDate, pattern);
    }
    
    /**
     * 将格式为yyyy-MM-dd_HH-mm-ss的日期字符串解析为Date类型
     * @param strDate 日期字符串，�? "2009-12-22_11-22-33" 
     * @return
     */
    public static synchronized java.util.Date parseDateFileFormat(String strDate)
    {
        String pattern = "yyyy-MM-dd_HH-mm-ss";
        return parseDateFormat(strDate, pattern);
    }
    
    /**
     * 获得符合W3C规范的日期格�? 格式为yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static synchronized String getDateW3CFormat()
    {
        Calendar cal = Calendar.getInstance();
        return getDateW3CFormat(cal);
    }
    
    /**
     * 获得符合W3C规范的日期格式，格式为yyyy-MM-dd HH:mm:ss 
     * @param cal
     * @return
     */
    public static synchronized String getDateW3CFormat(Calendar cal)
    {
        String pattern = "yyyy-MM-dd HH:mm:ss";
        return getDateFormat(cal, pattern);
    }
    
    /**
     * 获得符合W3C规范的日期格式，格式为yyyy-MM-dd HH:mm:ss 
     * @param date	Date对象
     * @return
     */
    public static synchronized String getDateW3CFormat(java.util.Date date)
    {
        String pattern = "yyyy-MM-dd HH:mm:ss";
        return getDateFormat(date, pattern);
    }
    
    /**
     * 将yyyy-MM-dd HH:mm:ss格式的日期字符串解析为Calendar类型
     * @param strDate 日期字符串，�? "2004-03-02 01:12:12" 
     * @return
     */
    public static synchronized Calendar parseCalendarW3CFormat(String strDate)
    {
        String pattern = "yyyy-MM-dd HH:mm:ss";
        return parseCalendarFormat(strDate, pattern);
    }
    
    /**
     * 将yyyy-MM-dd HH:mm:ss格式的日期字符串解析为Date类型 
     * @param strDate	日期字符串，�? "2004-03-02 01:12:12" 
     * @return
     */
    public static synchronized java.util.Date parseDateW3CFormat(String strDate)
    {
        String pattern = "yyyy-MM-dd HH:mm:ss";
        return parseDateFormat(strDate, pattern);
    }
    
    /**
     * 获得yyyy-MM-dd HH:mm:ss格式的日期字符串
     * @param cal
     * @return
     */
    public static synchronized String getDateFormat(Calendar cal)
    {
        String pattern = "yyyy-MM-dd HH:mm:ss";
        return getDateFormat(cal, pattern);
    }
    
    /**
     * 获得yyyy-MM-dd HH:mm:ss格式的日期字符串
     * @param date	Date对象
     * @return
     */
    public static synchronized String getDateFormat(java.util.Date date)
    {
        String pattern = "yyyy-MM-dd HH:mm:ss";
        return getDateFormat(date, pattern);
    }
    
    /**
     * 将yyyy-MM-dd HH:mm:ss格式的日期字符串解析为Calendar对象
     * @param strDate	日期字符串，�? "2004-03-02 01:12:12"
     * @return
     */
    public static synchronized Calendar parseCalendarFormat(String strDate)
    {
        String pattern = "yyyy-MM-dd HH:mm:ss";
        return parseCalendarFormat(strDate, pattern);
    }
    
    /**
     * 将yyyy-MM-dd HH:mm:ss格式的日期字符串解析为Date对象
     * @param strDate	日期字符串，�? "2004-03-02 01:12:12"
     * @return
     */
    public static synchronized java.util.Date parseDateFormat(String strDate)
    {
        String pattern = "yyyy-MM-dd HH:mm:ss";
        return parseDateFormat(strDate, pattern);
    }
    
    /**
     * 获得日期的字符串表示
     * @param cal	Calendar对象
     * @param pattern	日期表达�?
     * @return
     */
    public static synchronized String getDateFormat(Calendar cal, String pattern)
    {
        return getDateFormat(cal.getTime(), pattern);
    }

    /**
     * 获得日期的字符串表示
     * @param date	Date对象
     * @param pattern	日期表达�?
     * @return
     */
    public static synchronized String getDateFormat(java.util.Date date, String pattern)
    {
        sdf.applyPattern(pattern);
        String str = sdf.format(date);
        return str;
    }
    
    /**
     * 将日期字符串解析成Calendar类型
     * @param strDate	日期字符�?
     * @param pattern	日期表达�?
     * @return
     */
    public static synchronized Calendar parseCalendarFormat(String strDate, String pattern)
    {
        Calendar cal = null;
        sdf.applyPattern(pattern);
        try
        {
            sdf.parse(strDate);
            cal = sdf.getCalendar();
        }
        catch(Exception e) { }
        return cal;
    }

    /**
     * 将日期字符串解析成Date类型
     * @param strDate	日期字符�?
     * @param pattern	日期表达�? 
     * @return
     */
    public static synchronized java.util.Date parseDateFormat(String strDate, String pattern)
    {
        java.util.Date date = null;
        sdf.applyPattern(pattern);
        try
        {
            date = sdf.parse(strDate);
        }
        catch(Exception e) { }
        return date;
    }
    
    /**
     * 获得本年该月的最后一�?
     * @param month
     * @return
     */
    public static synchronized int getLastDayOfMonth(int month)
    {
        if(month < 1 || month > 12)
            return -1;
        int retn = 0;
        if(month == 2)
        {
            if(isLeapYear())
                retn = 29;
            else
                retn = dayArray[month - 1];
        } else
        {
            retn = dayArray[month - 1];
        }
        return retn;
    }
    
    /**
     * 获得指定年指定月的最后一�?
     * @param year
     * @param month
     * @return
     */
    public static synchronized int getLastDayOfMonth(int year, int month)
    {
        if(month < 1 || month > 12)
            return -1;
        int retn = 0;
        if(month == 2)
        {
            if(isLeapYear(year))
                retn = 29;
            else
                retn = dayArray[month - 1];
        } else
        {
            retn = dayArray[month - 1];
        }
        return retn;
    }

    /**
     * 本年是平年还是闰�?
     * @return
     */
    public static synchronized boolean isLeapYear()
    {
        Calendar cal = Calendar.getInstance();
        int year = cal.get(1);
        return isLeapYear(year);
    }

    /**
     * 指定年为平年还是闰年
     * @param year
     * @return
     */
    public static synchronized boolean isLeapYear(int year)
    {
        if(year % 400 == 0)
            return true;
        if(year % 4 == 0)
            return year % 100 != 0;
        else
            return false;
    }

    /**
     * 判断指定日期的年份是否是闰年
     * @param date	指定日期
     * @return
     */
    public static synchronized boolean isLeapYear(java.util.Date date)
    {
        GregorianCalendar gc = (GregorianCalendar)Calendar.getInstance();
        gc.setTime(date);
        int year = gc.get(1);
        return isLeapYear(year);
    }
    
    /**
     * 判断指定日期的年份是否是闰年
     * @param gc	指定日期
     * @return
     */
    public static synchronized boolean isLeapYear(Calendar gc)
    {
        int year = gc.get(1);
        return isLeapYear(year);
    }

    /**
     * 得到指定日期的前�?个工作日
     * @param date	指定日期
     * @return
     */
    public static synchronized java.util.Date getPreviousWeekDay(java.util.Date date)
    {
        GregorianCalendar gc = (GregorianCalendar)Calendar.getInstance();
        gc.setTime(date);
        return getPreviousWeekDay(((Calendar) (gc)));
    }

    /**
     * 得到指定日期的前�?个工作日
     * @param gc	指定日期
     * @return
     */
    public static synchronized java.util.Date getPreviousWeekDay(Calendar gc)
    {
        switch(gc.get(7))
        {
        case 2: // '\002'
            gc.add(5, -3);
            break;

        case 1: // '\001'
            gc.add(5, -2);
            break;

        default:
            gc.add(5, -1);
            break;
        }
        return gc.getTime();
    }
    
    /**
     * 得到指定日期的后�?个工作日
     * @param date	指定日期
     * @return
     */
    public static synchronized java.util.Date getNextWeekDay(java.util.Date date)
    {
        GregorianCalendar gc = (GregorianCalendar)Calendar.getInstance();
        gc.setTime(date);
        switch(gc.get(7))
        {
        case 6: // '\006'
            gc.add(5, 3);
            break;

        case 7: // '\007'
            gc.add(5, 2);
            break;

        default:
            gc.add(5, 1);
            break;
        }
        return gc.getTime();
    }

    /**
     * 得到指定日期的后�?个工作日
     * @param gc	指定日期
     * @return
     */
    public static synchronized Calendar getNextWeekDay(Calendar gc)
    {
        switch(gc.get(7))
        {
        case 6: // '\006'
            gc.add(5, 3);
            break;

        case 7: // '\007'
            gc.add(5, 2);
            break;

        default:
            gc.add(5, 1);
            break;
        }
        return gc;
    }

    /**
     * 取得指定日期的下�?个月的最后一�? 
     * @param date	指定日期
     * @return
     */
    public static synchronized java.util.Date getLastDayOfNextMonth(java.util.Date date)
    {
        GregorianCalendar gc = (GregorianCalendar)Calendar.getInstance();
        gc.setTime(date);
        gc.setTime(getNextMonth(gc.getTime()));
        gc.setTime(getLastDayOfMonth(gc.getTime()));
        return gc.getTime();
    }

    /**
     * 取得指定日期的下�?个星期的�?后一�?
     * @param date	指定日期
     * @return
     */
    public static synchronized java.util.Date getLastDayOfNextWeek(java.util.Date date)
    {
        GregorianCalendar gc = (GregorianCalendar)Calendar.getInstance();
        gc.setTime(date);
        gc.setTime(getNextWeek(gc.getTime()));
        gc.setTime(getLastDayOfWeek(gc.getTime()));
        return gc.getTime();
    }

    /**
     * 取得指定日期的下�?个月的第�?�?
     * @param date	指定日期
     * @return
     */
    public static synchronized java.util.Date getFirstDayOfNextMonth(java.util.Date date)
    {
        GregorianCalendar gc = (GregorianCalendar)Calendar.getInstance();
        gc.setTime(date);
        gc.setTime(getNextMonth(gc.getTime()));
        gc.setTime(getFirstDayOfMonth(gc.getTime()));
        return gc.getTime();
    }
    
    /**
     * 取得指定日期的下�?个月的第�?�?
     * @param gc
     * @return
     */
    public static synchronized Calendar getFirstDayOfNextMonth(Calendar gc)
    {
        gc.setTime(getNextMonth(gc.getTime()));
        gc.setTime(getFirstDayOfMonth(gc.getTime()));
        return gc;
    }

    /**
     * 取得指定日期的下�?个星期的第一�?
     * @param date
     * @return
     */
    public static synchronized java.util.Date getFirstDayOfNextWeek(java.util.Date date)
    {
        GregorianCalendar gc = (GregorianCalendar)Calendar.getInstance();
        gc.setTime(date);
        gc.setTime(getNextWeek(gc.getTime()));
        gc.setTime(getFirstDayOfWeek(gc.getTime()));
        return gc.getTime();
    }

    /**
     * 取得指定日期的下�?个星期的第一�?
     * @param gc
     * @return
     */
    public static synchronized Calendar getFirstDayOfNextWeek(Calendar gc)
    {
        gc.setTime(getNextWeek(gc.getTime()));
        gc.setTime(getFirstDayOfWeek(gc.getTime()));
        return gc;
    }

    /**
     * 取得指定日期的下�?个月
     * @param date
     * @return
     */
    public static synchronized java.util.Date getNextMonth(java.util.Date date)
    {
        GregorianCalendar gc = (GregorianCalendar)Calendar.getInstance();
        gc.setTime(date);
        gc.add(2, 1);
        return gc.getTime();
    }

    /**
     * 取得指定日期的下�?个月
     * @param gc
     * @return
     */
    public static synchronized Calendar getNextMonth(Calendar gc)
    {
        gc.add(2, 1);
        return gc;
    }

    /**
     * 取得指定日期的下�?�? 
     * @param date
     * @return
     */
    public static synchronized java.util.Date getNextDay(java.util.Date date)
    {
        GregorianCalendar gc = (GregorianCalendar)Calendar.getInstance();
        gc.setTime(date);
        gc.add(5, 1);
        return gc.getTime();
    }

    /**
     * 取得指定日期的下�?�? 
     * @param gc
     * @return
     */
    public static synchronized Calendar getNextDay(Calendar gc)
    {
        gc.add(5, 1);
        return gc;
    }

    /**
     * 取得指定日期的下�?个星�?
     * @param date
     * @return
     */
    public static synchronized java.util.Date getNextWeek(java.util.Date date)
    {
        GregorianCalendar gc = (GregorianCalendar)Calendar.getInstance();
        gc.setTime(date);
        gc.add(5, 7);
        return gc.getTime();
    }

    /**
     * 取得指定日期的下�?个星�?
     * @param gc
     * @return
     */
    public static synchronized Calendar getNextWeek(Calendar gc)
    {
        gc.add(5, 7);
        return gc;
    }

    /**
     * 取得指定日期的所处星期的�?后一�?
     * @param date
     * @return
     */
    public static synchronized java.util.Date getLastDayOfWeek(java.util.Date date)
    {
        GregorianCalendar gc = (GregorianCalendar)Calendar.getInstance();
        gc.setTime(date);
        switch(gc.get(7))
        {
        case 1: // '\001'
            gc.add(5, 6);
            break;

        case 2: // '\002'
            gc.add(5, 5);
            break;

        case 3: // '\003'
            gc.add(5, 4);
            break;

        case 4: // '\004'
            gc.add(5, 3);
            break;

        case 5: // '\005'
            gc.add(5, 2);
            break;

        case 6: // '\006'
            gc.add(5, 1);
            break;

        case 7: // '\007'
            gc.add(5, 0);
            break;
        }
        return gc.getTime();
    }

    /**
     * 取得指定日期的所处星期的第一�?
     * @param date
     * @return
     */
    public static synchronized java.util.Date getFirstDayOfWeek(java.util.Date date)
    {
        GregorianCalendar gc = (GregorianCalendar)Calendar.getInstance();
        gc.setTime(date);
        switch(gc.get(7))
        {
        case 1: // '\001'
            gc.add(5, 0);
            break;

        case 2: // '\002'
            gc.add(5, -1);
            break;

        case 3: // '\003'
            gc.add(5, -2);
            break;

        case 4: // '\004'
            gc.add(5, -3);
            break;

        case 5: // '\005'
            gc.add(5, -4);
            break;

        case 6: // '\006'
            gc.add(5, -5);
            break;

        case 7: // '\007'
            gc.add(5, -6);
            break;
        }
        return gc.getTime();
    }

    /**
     * 取得指定日期的所处星期的第一�?
     * @param gc
     * @return
     */
    public static synchronized Calendar getFirstDayOfWeek(Calendar gc)
    {
        switch(gc.get(7))
        {
        case 1: // '\001'
            gc.add(5, 0);
            break;

        case 2: // '\002'
            gc.add(5, -1);
            break;

        case 3: // '\003'
            gc.add(5, -2);
            break;

        case 4: // '\004'
            gc.add(5, -3);
            break;

        case 5: // '\005'
            gc.add(5, -4);
            break;

        case 6: // '\006'
            gc.add(5, -5);
            break;

        case 7: // '\007'
            gc.add(5, -6);
            break;
        }
        return gc;
    }

    /**
     * 取得指定日期的所处月份的�?后一�?
     * @param date
     * @return
     */
    public static synchronized java.util.Date getLastDayOfMonth(java.util.Date date)
    {
        GregorianCalendar gc = (GregorianCalendar)Calendar.getInstance();
        gc.setTime(date);
        switch(gc.get(2))
        {
        case 0: // '\0'
            gc.set(5, 31);
            break;

        case 1: // '\001'
            gc.set(5, 28);
            break;

        case 2: // '\002'
            gc.set(5, 31);
            break;

        case 3: // '\003'
            gc.set(5, 30);
            break;

        case 4: // '\004'
            gc.set(5, 31);
            break;

        case 5: // '\005'
            gc.set(5, 30);
            break;

        case 6: // '\006'
            gc.set(5, 31);
            break;

        case 7: // '\007'
            gc.set(5, 31);
            break;

        case 8: // '\b'
            gc.set(5, 30);
            break;

        case 9: // '\t'
            gc.set(5, 31);
            break;

        case 10: // '\n'
            gc.set(5, 30);
            break;

        case 11: // '\013'
            gc.set(5, 31);
            break;
        }
        if(gc.get(2) == 1 && isLeapYear(gc.get(1)))
            gc.set(5, 29);
        return gc.getTime();
    }

    /**
     * 取得指定日期的所处月份的�?后一�?
     * @param gc
     * @return
     */
    public static synchronized Calendar getLastDayOfMonth(Calendar gc)
    {
        switch(gc.get(2))
        {
        case 0: // '\0'
            gc.set(5, 31);
            break;

        case 1: // '\001'
            gc.set(5, 28);
            break;

        case 2: // '\002'
            gc.set(5, 31);
            break;

        case 3: // '\003'
            gc.set(5, 30);
            break;

        case 4: // '\004'
            gc.set(5, 31);
            break;

        case 5: // '\005'
            gc.set(5, 30);
            break;

        case 6: // '\006'
            gc.set(5, 31);
            break;

        case 7: // '\007'
            gc.set(5, 31);
            break;

        case 8: // '\b'
            gc.set(5, 30);
            break;

        case 9: // '\t'
            gc.set(5, 31);
            break;

        case 10: // '\n'
            gc.set(5, 30);
            break;

        case 11: // '\013'
            gc.set(5, 31);
            break;
        }
        if(gc.get(2) == 1 && isLeapYear(gc.get(1)))
            gc.set(5, 29);
        return gc;
    }

    /**
     * 取得指定日期的所处月份的第一�?
     * @param date
     * @return
     */
    public static synchronized java.util.Date getFirstDayOfMonth(java.util.Date date)
    {
        GregorianCalendar gc = (GregorianCalendar)Calendar.getInstance();
        gc.setTime(date);
        gc.set(5, 1);
        return gc.getTime();
    }

    /**
     * 取得指定日期的所处月份的第一�?
     * @param gc
     * @return
     */
    public static synchronized Calendar getFirstDayOfMonth(Calendar gc)
    {
        gc.set(5, 1);
        return gc;
    }

    /**
     * 将日期对象转换成为指定ORA日期、时间格式的字符串形式�?�如果日期对象为空，返回 �?个空字符串对象，而不是一个空对象
     * @param theDate
     * @param hasTime
     * @return
     */
    public static synchronized String toOraString(java.util.Date theDate, boolean hasTime)
    {
        DateFormat theFormat;
        if(hasTime)
            theFormat = getOraDateTimeFormat();
        else
            theFormat = getOraDateFormat();
        return toString(theDate, theFormat);
    }

    /**
     * 将日期对象转换成为指定日期�?�时间格式的字符串形式�?�如果日期对象为空，返回�?个空字符串对象，而不是一个空对象
     * @param theDate
     * @param hasTime
     * @return
     */
    public static synchronized String toString(java.util.Date theDate, boolean hasTime)
    {
        DateFormat theFormat;
        if(hasTime)
            theFormat = getDateTimeFormat();
        else
            theFormat = getDateFormat();
        return toString(theDate, theFormat);
    }

    /**
     * 创建�?个标准日期格式的克隆
     * @return
     */
    public static synchronized DateFormat getDateFormat()
    {
        SimpleDateFormat theDateFormat = (SimpleDateFormat)DATE_FORMAT.clone();
        theDateFormat.setLenient(false);
        return theDateFormat;
    }

    /**
     * 创建�?个标准时间格式的克隆
     * @return
     */
    public static synchronized DateFormat getDateTimeFormat()
    {
        SimpleDateFormat theDateTimeFormat = (SimpleDateFormat)DATE_TIME_FORMAT.clone();
        theDateTimeFormat.setLenient(false);
        return theDateTimeFormat;
    }
    
    /**
     * 创建�?个标准ORA日期格式的克�?
     * @return
     */
    public static synchronized DateFormat getOraDateFormat()
    {
        SimpleDateFormat theDateFormat = (SimpleDateFormat)ORA_DATE_FORMAT.clone();
        theDateFormat.setLenient(false);
        return theDateFormat;
    }

   /**
    * 创建�?个标准ORA时间格式的克�?
    * @return
    */
    public static synchronized DateFormat getOraDateTimeFormat()
    {
        SimpleDateFormat theDateTimeFormat = (SimpleDateFormat)ORA_DATE_TIME_FORMAT.clone();
        theDateTimeFormat.setLenient(false);
        return theDateTimeFormat;
    }

    /**
     * 将一个日期对象转换成为指定日期�?�时间格式的字符串�?? 如果日期对象为空，返回一个空字符串，而不是一个空对象
     * @param theDate	要转换的日期对象
     * @param theDateFormat	 返回的日期字符串的格�?
     * @return
     */
    public static synchronized String toString(java.util.Date theDate, DateFormat theDateFormat)
    {
        if(theDate == null)
            return "";
        else
            return theDateFormat.format(theDate);
    }
    
    /**
     * 验证时间格式是否正确
     * @param sDate
     * @return
     */
    public static boolean isValidDate(String sDate) {
	     String datePattern1 = "(2|1){1}\\d{3}-\\d{2}-\\d{2} [0-2]?[0-9]:[0-6]?[0-9]:[0-6][0-9]\\.?\\d*"; 
	     if ((sDate != null)) {
	         Pattern pattern = Pattern.compile(datePattern1);
	         Matcher match = pattern.matcher(sDate);
	         return match.matches();
	     }
	     return false;
	 }
    
	public static void main(String[] args) throws Exception {
		
		System.out.println("-------"+DateUtils.getDateMinuteFormat());
	}

}
